﻿#pragma once


// CShowCrack
#include "FileSys/CImgOperator.h"

typedef struct __NM_CRACKVIEW {
	NMHDR	hdr;
	POINT	ptCur1;
	POINT	ptCur2;
}NM_CRACKVIEW;

#define			CVN_PTCHANGED		(WM_USER + 1000)	// 裂缝左右两个点发生变化
#define			CVN_PREVIOUSGJ		(WM_USER + 1001)	// 上一个构件
#define			CVN_NEXTGJ			(WM_USER + 1002)	// 下一个构件

class CShowCrack : public CWnd
{
	DECLARE_DYNAMIC(CShowCrack)

public:
	void	initRect();								//qzg 2019.10.21
private:
	CImgOperator			m_imgOperator;				// 图像处理类，所有图像从该类中调出

	bool					m_bGray;					// 是否显示灰度图
	int						m_nCurGJ;					// 当前构件ID

	CBrush					m_brBack;					// 背景画刷

	CRect					m_rtCtrl;					// 控件区域位置
	CRect					m_rtImg;					// 图像区域位置

	CRect					m_rtZoom;					// 缩放条位置
	CRect					m_rtBtnZoomIn;				// 缩小按钮位置
	CRect					m_rtBtnZoomOut;				// 放大按钮位置

	CRect					m_rtBtnPrevious;			// 上一个控件位置
	CRect					m_rtBtnNext;				// 下一个控件位置

	POINT					m_ptImgMouse;				// 鼠标选中点在图像中的实际位置
	POINT					m_ptLeftTop;				// 左上角相对于完全缩放后的图像位置
	double					m_dCoe;						// 缩放系数

	double					m_dImgCoe;					// 图像缩放系数

	BOOL					m_bLBtnDown;				// 鼠标左键是否按下
	CPoint					m_ptLBtnDown;				// 鼠标左键按下时的位置

	CPoint					m_ptMouse;					// 鼠标指针在控件中的相对位置，鼠标按下和释放的位置一致是才能修改裂缝信息
	int						m_nLastSelPt;				// 上一个选中点
	int						m_nCurSelPt;				// 当前选中点
	//int						m_nTmpSelPt;				// 临时变量；
	BOOL					m_bPtSel;					// 是否有点选中；

	CArray<POINT, POINT>	m_arrPtZoomValue;			// 每一个缩放点的具体位置

	CArray<CButton*, CButton*> m_arrBtn;				// 按键数组，存放四个按钮


//	void	initRect();															// 初始化控件相关位置信息
	void	DrawCtrl(int nRedrawFlag);											// 绘制整个控件
	void	DrawImg(CDC* pDC);													// 绘制图像
	void	DrawZoom(CDC* pDC);													// 绘制缩放区域 包括放大缩小按键
	void	DrawBtn(CDC* pDC);													// 绘制上一个下一个按钮
	void	PasteImg(CDC* pDC, const CString& strBtnFileName, CRect& rect);		// 贴图（无损复制位图）

	void	CreateBtn();														// 创建自定义按键
	void	DeleteBtn();														// 释放按键
	void	EnableDisableBtn();													// 判断按键状态并刷新

	POINT	CalcMousePt(const CPoint& ptCur, const double& dCoeChange);			// 计算鼠标选中点位置
	void	CalcLeftTopPt(const CPoint& ptCur, const double& dCoeLast);			// 计算图像左上角坐标

	void	CalcDCoe(const double& dCoeChange);									// 计算当前缩放系数

public:
	void	initImg(const int& nIdx, const bool bNew, const bool bGray);		// 初始化图像及相关信息

	void	ZoomIn();															// 缩小
	void	ZoomOut();															// 放大

	float	FindCrack();														// 查找当前加载图像裂缝位置，并返回裂缝大小
	void	GetWidAndHeight(int &nHeight, int &nWid);				//获取高度、宽度
	void	UpdateBtn();				//更新按钮
protected:
	BOOL RegisterWndClass(HINSTANCE hInstance = NULL);

	LRESULT SendMessageToParent(int nMessage);
public:
	CShowCrack();
	virtual ~CShowCrack();

protected:
	DECLARE_MESSAGE_MAP()
public:
	afx_msg void OnButtonClick(UINT uID);
	afx_msg void OnPaint();
	afx_msg void OnSize(UINT nType, int cx, int cy);
	afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
	afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
	afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
	afx_msg void OnMouseMove(UINT nFlags, CPoint point);
	afx_msg BOOL OnMouseWheel(UINT nFlags, short zDelta, CPoint pt);
	afx_msg BOOL OnEraseBkgnd(CDC* pDC);
	afx_msg LRESULT OnInitTypeRect(WPARAM wParam, LPARAM lParam);
};


